#include <stdio.h>

#define NEWLINE '\n'

int main()
{
    int a = 21;
    int b = 10;
    int c;

    printf("================算术运算符================");
    printf("%c", NEWLINE);

    c = a + b;
    printf("Line 1 - c 的值是 %d\n", c);
    c = a - b;
    printf("Line 2 - c 的值是 %d\n", c);
    c = a * b;
    printf("Line 3 - c 的值是 %d\n", c);
    c = a / b;
    printf("Line 4 - c 的值是 %d\n", c);
    c = a % b;
    printf("Line 5 - c 的值是 %d\n", c);
    c = a++; // 赋值后再加 1 ，c 为 21，a 为 22
    printf("Line 6 - c 的值是 %d\n", c);
    c = a--; // 赋值后再减 1 ，c 为 22 ，a 为 21
    printf("Line 7 - c 的值是 %d\n", c);

    printf("%c", NEWLINE);

    a = 10;
    c = a++;
    printf("先赋值后运算：\n");
    printf("Line 1 - c 的值是 %d\n", c);
    printf("Line 2 - a 的值是 %d\n", a);
    a = 10;
    c = a--;
    printf("Line 3 - c 的值是 %d\n", c);
    printf("Line 4 - a 的值是 %d\n", a);

    printf("先运算后赋值：\n");
    a = 10;
    c = ++a;
    printf("Line 5 - c 的值是 %d\n", c);
    printf("Line 6 - a 的值是 %d\n", a);
    a = 10;
    c = --a;
    printf("Line 7 - c 的值是 %d\n", c);
    printf("Line 8 - a 的值是 %d\n", a);

    printf("================关系运算符================");
    printf("%c", NEWLINE);

    a = 21;
    b = 10;

    if (a == b)
    {
        printf("Line 1 - a 等于 b\n");
    }
    else
    {
        printf("Line 1 - a 不等于 b\n");
    }
    if (a < b)
    {
        printf("Line 2 - a 小于 b\n");
    }
    else
    {
        printf("Line 2 - a 不小于 b\n");
    }
    if (a > b)
    {
        printf("Line 3 - a 大于 b\n");
    }
    else
    {
        printf("Line 3 - a 不大于 b\n");
    }
    /* 改变 a 和 b 的值 */
    a = 5;
    b = 20;
    if (a <= b)
    {
        printf("Line 4 - a 小于或等于 b\n");
    }
    if (b >= a)
    {
        printf("Line 5 - b 大于或等于 a\n");
    }
    printf("================逻辑运算符================");
    printf("%c", NEWLINE);
    a = 5;
    b = 20;

    if (a && b) // 称为逻辑与运算符。如果两个操作数都非零，则条件为真。
    {
        printf("Line 1 - 条件为真\n");
    }
    if (a || b) // 称为逻辑或运算符。如果两个操作数中有任意一个非零，则条件为真。
    {
        printf("Line 2 - 条件为真\n");
    }
    /* 改变 a 和 b 的值 */
    a = 0;
    b = 10;
    if (a && b)
    {
        printf("Line 3 - 条件为真\n");
    }
    else
    {
        printf("Line 3 - 条件为假\n");
    }
    if (!(a && b)) // 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
    {
        printf("Line 4 - 条件为真\n");
    }
    printf("================位运算符================");
    printf("%c", NEWLINE);
    unsigned int f = 60; /* 60 = 0011 1100 */
    unsigned int e = 13; /* 13 = 0000 1101 */
    c = 0;

    c = f & e; /* 12 = 0000 1100 */
    printf("Line 1 - c 的值是 %d\n", c);

    c = f | e; /* 61 = 0011 1101 */
    printf("Line 2 - c 的值是 %d\n", c);

    c = f ^ e; /* 49 = 0011 0001 */
    printf("Line 3 - c 的值是 %d\n", c);

    c = ~f; /*-61 = 1100 0011 */
    printf("Line 4 - c 的值是 %d\n", c);

    c = f << 2; /* 240 = 1111 0000 */
    printf("Line 5 - c 的值是 %d\n", c);

    c = f >> 2; /* 15 = 0000 1111 */
    printf("Line 6 - c 的值是 %d\n", c);

    printf("================赋值运算符================");
    printf("%c", NEWLINE);
    a = 21;
    c;

    c = a;
    printf("Line 1 - =  运算符实例，c 的值 = %d\n", c);

    c += a;
    printf("Line 2 - += 运算符实例，c 的值 = %d\n", c);

    c -= a;
    printf("Line 3 - -= 运算符实例，c 的值 = %d\n", c);

    c *= a;
    printf("Line 4 - *= 运算符实例，c 的值 = %d\n", c);

    c /= a;
    printf("Line 5 - /= 运算符实例，c 的值 = %d\n", c);

    c = 200;
    c %= a;
    printf("Line 6 - %%= 运算符实例，c 的值 = %d\n", c);

    c <<= 2;
    printf("Line 7 - <<= 运算符实例，c 的值 = %d\n", c);

    c >>= 2;
    printf("Line 8 - >>= 运算符实例，c 的值 = %d\n", c);

    c &= 2;
    printf("Line 9 - &= 运算符实例，c 的值 = %d\n", c);

    c ^= 2;
    printf("Line 10 - ^= 运算符实例，c 的值 = %d\n", c);

    c |= 2;
    printf("Line 11 - |= 运算符实例，c 的值 = %d\n", c);

    printf("================其他运算符================");
    printf("%c", NEWLINE);
    int x = 4;
    short y;
    double z;
    int *ptr;

    /* sizeof 运算符实例 */
    printf("Line 1 - 变量 x 的大小 = %lu\n", sizeof(x));
    printf("Line 2 - 变量 y 的大小 = %lu\n", sizeof(y));
    printf("Line 3 - 变量 z 的大小 = %lu\n", sizeof(z));

    /* & 和 * 运算符实例 */
    ptr = &x; /* 'ptr' 现在包含 'a' 的地址 */
    printf("x 的值是 %d\n", x);
    printf("*ptr 是 %d\n", *ptr);

    /* 三元运算符实例 */
    x = 10;
    y = (x == 1) ? 20 : 30;
    printf("y 的值是 %d\n", y);

    y = (x == 10) ? 20 : 30;
    printf("y 的值是 %d\n", y);
}